home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / 3dvect39 / xmouse.asm < prev    next >
Assembly Source File  |  1994-10-30  |  9KB  |  298 lines

  1. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  2. ;
  3. ; Filename     : More.inc
  4. ; Included from: Main assembley module
  5. ; Description  : X mode Mouse routines
  6. ;
  7. ; Written by: John McCarthy
  8. ;             1316 Redwood Lane
  9. ;             Pickering, Ontario.
  10. ;             Canada, Earth, Milky Way (for those out-of-towners)
  11. ;             L1X 1C5
  12. ;
  13. ; Internet/Usenet:  BRIAN.MCCARTHY@CANREM.COM
  14. ;         Fidonet:  Brian McCarthy 1:229/15
  15. ;   RIME/Relaynet: ->CRS
  16. ;
  17. ; Home phone, (905) 831-1944, don't call at 2 am eh!
  18. ;
  19. ; John Mccarthy would really love to work for a company programming Robots
  20. ; or doing some high intensive CPU work.  Hint. Hint.
  21. ;
  22. ; Send me your protected mode source code!
  23. ; Send me your Objects!
  24. ; But most of all, Send me a postcard!!!!
  25. ;
  26. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  27.  
  28.          .386p
  29.          jumps
  30.  
  31. code32   segment para public use32
  32.          assume cs:code32, ds:code32
  33.  
  34.          include pmode.ext                  ; protected mode externals
  35.          include xmode.ext                  ; include externals for xmode routines
  36.          include clear.ext
  37.          include macros.inc
  38.  
  39.          public _show_mouse
  40.          public _get_mouse_position
  41.          public _plot_mouse
  42.          public _instant_mouse
  43.          public _compiled_mouse
  44.          public _remove_mouse
  45.          public _mousex
  46.          public _mousey
  47.          public _mousebuttons
  48.          public _mousebitmap
  49.          public _mousesavemap
  50.  
  51.          public _ismouse
  52.          public _mousex1
  53.          public _mousex2
  54.          public _mousey1
  55.          public _mousey2
  56.  
  57. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  58. ; x-mode mouse routines in protected mode for 3d vectors source
  59. ;
  60. ; _show_mouse (int x, int y, int xclipl, int xclipr, int yclipt, int yclipb)
  61. ; _get_mouse_position
  62. ; _plot_mouse
  63. ; _remove_mouse
  64. ; _instant_mouse
  65. ;
  66. ; after ploting mouse, _sync_display is not called
  67. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  68.  
  69. _ismouse      db -1  ; is mouse present?
  70. _mousex1      dw ?
  71. _mousex2      dw ?   ; clipping parameters
  72. _mousey1      dw ?
  73. _mousey2      dw ?
  74. _mousex       dw 0   ; mouse location, buttons
  75. _mousey       dw 0
  76. _mousebuttons dw 0
  77. _mousebitmap  dd ?
  78. _mousesavemap dd ?
  79.  
  80. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  81. ; _show_mouse (int x, int y, int xclipl, int xclipr, int yclipt, int yclipb)
  82. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  83.  
  84. sm_stack struc
  85.          dd ?                               ; ebp
  86.          dd ?                               ; caller
  87.          my2       dw ?
  88.          my1       dw ?
  89.          mx2       dw ?
  90.          mx1       dw ?                     ; clipping parameters of mouse
  91.          savemap   dd ?                     ; enough memory for saved screen data
  92.          mousemap  dd ?                     ; bitmap to use for mouse
  93.          setm_ypos dw ?                     ; y pos of mouse
  94.          setm_xpos dw ?                     ; x pos of mouse
  95. sm_stack ends
  96.  
  97. _show_mouse:
  98.          push ebp
  99.          call _remove_mouse
  100.          mov v86r_ax,0                      ; enable mouse
  101.          mov al,33h
  102.          int 33h
  103.          mov ah,v86r_ah                     ; check if hardware/driver installed
  104.          xor ah,255
  105.          mov _ismouse, ah
  106.          jne sm_nomouse                     ; no mouse, exit
  107.          mov ebp, esp                       ; set up stack frame
  108.          mov edx,[ebp].savemap
  109.          mov _mousesavemap,edx
  110.          mov ecx,[ebp].mousemap
  111.          mov _mousebitmap,ecx
  112.          mov ebx,[ecx]                      ; transfer x,y size of mouse bitmap
  113.          mov [edx],ebx
  114.  
  115.          mov cx, [ebp].setm_xpos
  116.          mov dx, [ebp].setm_ypos
  117.  
  118.          mov v86r_ax,4                      ; position mouse
  119.          mov v86r_cx,cx
  120.          mov v86r_dx,dx
  121.          int 33h
  122.  
  123.          mov ebp, esp                       ; set up stack frame
  124.          mov cx, [ebp].mx1
  125.          mov dx, [ebp].mx2
  126.          shl cx,1
  127.          mov ebx,_mousebitmap
  128.          sub dx,[ebx]
  129.          shl dx,1
  130.  
  131.          mov v86r_ax,7                      ; set screen size
  132.          mov v86r_cx,cx
  133.          mov v86r_dx,dx
  134.          int 33h                            ; *2 gives greater resolution!!!!!
  135.  
  136.          mov ebp, esp                       ; set up stack frame
  137.          mov cx, [ebp].my1
  138.          mov dx, [ebp].my2
  139.          shl cx,1
  140.          mov ebx,_mousebitmap
  141.          sub dx,[ebx+2]
  142.          shl dx,1
  143.  
  144.          mov v86r_ax,8
  145.          mov v86r_cx,cx
  146.          mov v86r_dx,dx
  147.          int 33h
  148.  
  149.          mov v86r_ax,15                     ; set mouse mickeys (8 = default)
  150.          mov v86r_cx,8
  151.          mov v86r_dx,8
  152.          int 33h
  153.  
  154. sm_nomouse:
  155.          mov firstcall,0                    ; first call to mouse routines, reset
  156.          pop ebp
  157.          ret 20
  158.  
  159. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  160. ; Guess what this does?
  161. ; In = none
  162. ; Out = cx = mouse x
  163. ;       dx = mouse y
  164. ;       bx = mouse buttons
  165. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  166.  
  167. _get_mouse_position:
  168.          cmp _ismouse,0
  169.          jne _ret
  170.          mov v86r_ax,3                      ; call bios routines
  171.          mov al,33h
  172.          int 33h
  173.          mov bx,v86r_bx                     ; button status, mid right left=%111
  174.          mov cx,v86r_cx                     ; coloum
  175.          mov dx,v86r_dx                     ; row
  176.          mov _mousebuttons,bx               ; save button status
  177.          shr cx,1                           ; compensate for resolution!!!
  178.          shr dx,1
  179.          mov _mousex,cx
  180.          mov _mousey,dx
  181.  
  182.          ret
  183.  
  184. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  185. ; Plot mouse at new location. must be called every frame
  186. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  187.  
  188. firstcall     db 0
  189.  
  190. _plot_mouse:
  191.          cmp _ismouse,0                     ; plot mouse needs modification
  192.          jne _ret                           ; if used with page flipping, (save
  193.                                             ; more than one page)
  194.          call _remove_mouse
  195.          mov firstcall,1
  196.  
  197.          call _get_mouse_position           ; get new mouse location
  198.  
  199.          mov esi,_mousebitmap
  200.          mov bx, [esi+2]                    ; counters
  201.          mov ax, [esi]
  202.          mov esi,_mousesavemap
  203.          mov [esi],ax
  204.          mov [esi+2],bx
  205.          add esi, 4                         ; indexer to bitmap saved data
  206.  
  207. pl_morew:
  208.          push ax esi cx dx bx                ; save data under new cursor
  209.          push cx dx
  210.          call _read_point
  211.          pop bx dx cx esi
  212.          mov b [esi],al
  213.          pop ax
  214.          inc esi
  215.          inc cx
  216.          dec ax
  217.          cmp ax,0
  218.          jne pl_morew
  219.  
  220.          inc dx
  221.          mov cx,_mousex
  222.          mov edi,_mousebitmap
  223.          mov ax,[edi]
  224.          dec bx
  225.          cmp bx,0
  226.          jne pl_morew
  227.  
  228.          push edi
  229.          pushw _mousex
  230.          pushw _mousey
  231.          call _tdraw_bitmap                 ; draw new mouse
  232.  
  233.          ret
  234.  
  235. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  236. ; Plot single mouse, doesnt remember background
  237. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  238.  
  239. _instant_mouse:
  240.          cmp _ismouse,0
  241.          jne _ret
  242.  
  243.          call _get_mouse_position           ; get new mouse location
  244.  
  245.          mov eax,_mousebitmap
  246.          push eax
  247.          pushw _mousex
  248.          pushw _mousey
  249.          call _tdraw_bitmap                 ; draw new mouse
  250.  
  251.          ret
  252.  
  253. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  254. ; Plot compiled mouse, doesnt remember background
  255. ; In: EAX => compiled bitmap routine
  256. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  257.  
  258. _compiled_mouse:
  259.          cmp _ismouse,0
  260.          jne _ret
  261.  
  262.          push eax
  263.  
  264.          call _get_mouse_position           ; get new mouse location
  265.  
  266.          mov bx,cx
  267.          mov cx,dx
  268.  
  269.          call _compile_xy
  270.  
  271.          mov edi,_current_page
  272.          add edi,esi
  273.  
  274.          pop ebp
  275.          call ebp                           ; draw new mouse
  276.  
  277.          ret
  278.  
  279. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  280. ; Remove mouse from screen - plot old stuff back underniegth
  281. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  282.  
  283. _remove_mouse:
  284.          cmp firstcall,0                    ; check if mouse on screen
  285.          je _ret
  286.  
  287.          mov eax,_mousesavemap
  288.          push eax
  289.          pushw _mousex
  290.          pushw _mousey
  291.          call _draw_bitmap                  ; restore old data under cursor
  292.          mov firstcall,0                    ; mouse is gone, say so
  293.  
  294.          ret
  295.  
  296. code32   ends
  297.          end
  298.